package com.master_jpeg;

import com.master_jpeg.imgwork.ImageReader;
import com.master_jpeg.imgwork.ImageWriter;
import org.apache.commons.imaging.ImageFormats;
import org.apache.commons.imaging.ImageReadException;
import org.apache.commons.imaging.ImageWriteException;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.IndexColorModel;
import java.awt.image.WritableRaster;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;

/**
 * По сути мы работаем с изображениями, в основном с их представлением в виде BufferedImage
 * он расширяет стандартный класс java.awt.Image и интерфейсы WritableRenderedImage, Transparency.
 * нвм же удобнее работать с изображением, как с масивом байт
 * поэтомы впринципе можем отнаследоваться от этого класса
 * также добавим несколько методов работы
 */
public abstract class DataObject extends BufferedImage {


    protected String filePath;

    public DataObject(int width, int height, int imageType) {
        super(width, height, imageType);
    }

    public DataObject(int width, int height, int imageType, IndexColorModel cm) {
        super(width, height, imageType, cm);
    }

    public DataObject(ColorModel cm, WritableRaster raster, boolean isRasterPremultiplied, Hashtable<?, ?> properties) {
        super(cm, raster, isRasterPremultiplied, properties);
    }

   public byte[] getImageSource(ImageFormats imageType) throws IOException {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(this, imageType.getName(), baos);
        baos.flush();
        byte[] bytes = baos.toByteArray();
        baos.close();

        return bytes;
    }


    public DataObject readImage(File imgFile) {
        DataObject result = null;
        ImageReader read = new ImageReader();

        try {
            result = (DataObject) read.imageRead(imgFile);
        } catch (ImageReadException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
       return result;
    }

    public static byte[] writeImage(File imgFile, ImageFormats format){
        byte[] result = null;
        try {
            result = ImageWriter.imageWrite(imgFile, format);
        } catch (ImageReadException e) {
            e.printStackTrace();
        } catch (ImageWriteException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

}
